'''
EJERCICIO:
Explora el concepto de manejo de excepciones según tu lenguaje.
Fuerza un error en tu código, captura el error, imprime dicho error
y evita que el programa se detenga de manera inesperada.
Prueba a dividir "10/0" o acceder a un índice no existente
de un listado para intentar provocar un error.
'''

#
try:
    print(10/1) # División por cero
    print([1, 2, 3, 4][5]) # Acceso a un índice no existente

    print('Operacion realizada')
except Exception as e: # Captura todas las excepciones
    print(f'Se ha producido un error: {e}')


'''
DIFICULTAD EXTRA (opcional):
Crea una función que sea capaz de procesar parámetros, pero que también
pueda lanzar 3 tipos diferentes de excepciones (una de ellas tiene que
corresponderse con un tipo de excepción creada por nosotros de manera
personalizada, y debe ser lanzada de manera manual) en caso de error.
- Captura todas las excepciones desde el lugar donde llamas a la función.
- Imprime el tipo de error.
- Imprime si no se ha producido ningún error.
- Imprime que la ejecución ha finalizado.
'''

print('\n\n\n--- EJERCICIO EXTRA ---\n')

class StrTypeError(Exception):
    pass

def process_params(parameters: list): 

    if len(parameters) < 3: 
        raise IndexError() # Comprueba si el número de elementos es correcto
    elif parameters[1] == 0:
        raise ZeroDivisionError() # Lanza un error de división por cero
    elif type(parameters[2]) == str:
        raise StrTypeError(
            "El segundo elemento no puede ser una cadena de texto.") # Lanza un error de tipo de dato    
    
    print(parameters[4]) 
    print(parameters[0]/parameters[1])
    print(parameters[2] + 5)

try:
    process_params([1, 2, 'DANIEL', 4])
except IndexError as e:
    print("El número de elementos de la lista debe ser mayor que dos.")
except ZeroDivisionError as e:
    print("El segundo elemento de la lista no puede ser un cero.")
except StrTypeError as e:
    print(f"{e}")
except Exception as e:
    print(f"Se ha producido un error inesperado: {e}")
else:
    print("No se ha producido ningún error.")
finally:
    print("El programa finaliza sin detenerse.")